﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Slex.Lib.Interactions
{
    /// <summary>
    /// A trigger action that targets an element
    /// </summary>
    public abstract class TargettedTriggerAction : SlexTriggerAction
    {
        /// <summary>
        /// The type of the target
        /// </summary>
        public ContextTypeEnum TargetType
        {
            get { return (ContextTypeEnum)GetValue(TargetTypeProperty); }
            set { SetValue(TargetTypeProperty, value); }
        }

        // Using a DependencyProperty as the backing store for SourceType.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TargetTypeProperty =
            DependencyProperty.Register("TargetType", typeof(ContextTypeEnum), typeof(TargettedTriggerAction), new PropertyMetadata(ContextTypeEnum.Model));


        /// <summary>
        /// Name of the element to target
        /// </summary>
        public string TargetName
        {
            get { return (string)GetValue(TargetNameProperty); }
            set { SetValue(TargetNameProperty, value); }
        }

        // Using a DependencyProperty as the backing store for TargetName.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TargetNameProperty =
            DependencyProperty.Register("TargetName", typeof(string), typeof(TargettedTriggerAction), new PropertyMetadata("This"));


        /// <summary>
        /// Actual target of this trigger
        /// </summary>
        protected object Target
        {
            get { return (object)GetValue(TargetProperty); }
            set { SetValue(TargetProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Source.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TargetProperty =
            DependencyProperty.Register("Target", typeof(object), typeof(TargettedTriggerAction), new PropertyMetadata(null));


        /// <summary>
        /// Internally initialize the element
        /// </summary>
        internal override void InternalInitialize()
        {

            base.InternalInitialize();


            if (AssociatedObject != null && Target == null)
            {
                if (TargetType == ContextTypeEnum.Element)
                {
                    if (TargetName == "This" || string.IsNullOrEmpty(TargetName))
                    {
                        Target = AssociatedObject;
                    }
                    else
                        Target = (AssociatedObject as FrameworkElement).FindName(TargetName);
                }
                else if (TargetType == ContextTypeEnum.Model)
                {
                    Target = (AssociatedObject as FrameworkElement).DataContext;
                }

            }

        }


    }
}
